package com.wmwj.hxlj.mapper;

import com.wmwj.hxlj.entity.Tag;
import org.apache.ibatis.annotations.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 标签映射器接口，用于执行与标签相关的数据库操作
 */
@Mapper
public interface TagMapper {

    /**
     * 根据标签ID查找标签
     *
     * @param id 标签的唯一标识符
     * @return 返回找到的标签对象，如果不存在则返回null
     */
    @Select("SELECT * FROM tag WHERE id = #{id}")
    Tag findById(int id);

    /**
     * 根据标签名称查找标签
     *
     * @param name 标签名称
     * @return 返回找到的标签对象，如果不存在则返回null
     */
    @Select("SELECT * FROM tag WHERE name = #{name}")
    Tag findByName(String name);

    /**
     * 查找所有启用的标签，并按照使用次数降序排序
     *
     * @return 返回所有启用的标签列表
     */
    @Select("SELECT * FROM tag WHERE status = 1 ORDER BY use_count DESC")
    List<Tag> findAllEnabled();



    @Select("<script>" +
            "SELECT * FROM tag " +
            "<where>" +
            "   <if test='keyword != null and keyword != \"\"'>" +
            "       name LIKE CONCAT('%', #{keyword}, '%') OR id = #{keyword}" +
            "   </if>" +
            "</where>" +
            "ORDER BY create_time DESC " +
            "LIMIT #{pageStart}, #{pageSize}" +
            "</script>")
    List<Tag> selectByPage(@Param("keyword") String keyword,
                           @Param("pageStart") int pageStart,
                           @Param("pageSize") int pageSize);

    @Select("<script>" +
            "SELECT COUNT(*) FROM tag " +
            "<where>" +
            "   <if test='keyword != null and keyword != \"\"'>" +
            "       name LIKE CONCAT('%', #{keyword}, '%') OR id = #{keyword}" +
            "   </if>" +
            "</where>" +
            "</script>")
    long countByPage(@Param("keyword") String keyword);



    /**
     * 插入新的标签记录到数据库
     *
     * @param tag 要插入的标签对象
     * @return 返回插入操作影响的行数
     */
    @Insert("INSERT INTO tag (name, description, create_time, update_time, status, use_count) " +
            "VALUES (#{name}, #{description}, #{createTime}, #{updateTime}, #{status}, #{useCount})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(Tag tag);

    /**
     * 更新数据库中的标签信息
     *
     * @param tag 要更新的标签对象
     * @return 返回更新操作影响的行数
     */
    @Update("UPDATE tag SET name = #{name}, description = #{description}, " +
            "update_time = #{updateTime}, status = #{status} WHERE id = #{id}")
    int update(Tag tag);

    /**
     * 根据标签ID删除标签记录
     *
     * @param id 要删除的标签的唯一标识符
     * @return 返回删除操作影响的行数
     */
    @Delete("DELETE FROM tag WHERE id = #{id}")
    int deleteById(Long id);

    /**
     * 批量增加标签的使用次数
     *
     * @param names 标签名称数组
     * @return 返回更新操作影响的行数
     */
    @Update("<script>" +
            "UPDATE tag SET use_count = use_count + 1 WHERE id IN " +
            "<foreach item='name' collection='names' open='(' separator=',' close=')'>" +
            "#{name}" +
            "</foreach>" +
            "</script>")
    int batchIncrementUseCount(@Param("names") String[] names);

    /**
     * 批量减少标签的使用次数
     *
     * @param names 标签名称数组
     * @return 返回更新操作影响的行数
     */
    @Update("<script>" +
            "UPDATE tag SET use_count = use_count - 1 WHERE name IN " +
            "<foreach item='name' collection='names' open='(' separator=',' close=')'>" +
            "#{name}" +
            "</foreach>" +
            "</script>")
    int batchDecrementUseCount(@Param("names") String[] names);

    /**
     * 更新标签的状态和最后修改时间
     *
     * @param id       标签的唯一标识符
     * @param status   标签的新状态
     * @param updateTime 标签的最后修改时间
     * @return 返回更新操作影响的行数
     */
    @Update("UPDATE tag SET status = #{status}, update_time = #{updateTime} WHERE id = #{id}")
    int updateStatus(@Param("id") Long id, @Param("status") Integer status, @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询使用次数最多的标签
     *
     * @param limit 返回的标签数量限制
     * @return 使用次数最多的标签列表
     */
    @Select("SELECT * FROM tag ORDER BY use_count DESC LIMIT #{limit}")
    List<Tag> findMostUsedTags(@Param("limit") int limit);

}
